package lv.clientedisqueria.view.tema;

import java.awt.BorderLayout;
import java.awt.GridLayout;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;

import lv.clientedisqueria.controller.Controller;
import lv.clientedisqueria.controller.tema.TemaController;
import lv.clientedisqueria.model.tema.TemaModel;
import lv.clientedisqueria.view.AbstractPanel;
import lv.mensajeriadisqueria.idomain.ITema;

@SuppressWarnings("serial")
public class TemaPanel extends AbstractPanel<ITema> {

	private TemaController temaController;
	
	private JPanel textFieldsPanel;
	private JTextField nombreTF;
	private JLabel nombreLbl;
	private JLabel letraLbl;
	private JTextField letraTF;
	
	private JScrollPane scrollPane;
	private JTable temaTabla;

	public TemaPanel(TemaModel temaModel) {
		super(temaModel);
		this.temaController = new TemaController(temaModel);
		this.temaController.addObserver(this);
		iniciarView();
	}
	
	private void iniciarView() {
		this.setLayout(new BorderLayout());
		this.add(new TemaMenuBoton(this.temaController), BorderLayout.NORTH);
		
		JPanel panel = new JPanel(new BorderLayout());
		panel.add(getTextFieldsPanel(), BorderLayout.NORTH);
		
		panel.add(getScrollPane(), BorderLayout.CENTER);
		add(panel, BorderLayout.CENTER);
	}

//******************* Campos ******************************
	private JPanel getTextFieldsPanel() {
		if (textFieldsPanel == null) {
			textFieldsPanel = new JPanel(new GridLayout(2, 2));
			textFieldsPanel.add(getNombreLbl());
			textFieldsPanel.add(getNombreTF());
			textFieldsPanel.add(getLetraLbl());
			textFieldsPanel.add(getLetraTF());
			textFieldsPanel.validate();
			
			ITema tema = temaController.getModelo().getTablaModel().getSeleccionado();

			if(tema!= null){
				actualizarCampos(tema);
			}
		}
		return textFieldsPanel;
	}
	
	private JTextField getNombreTF() {
		if (nombreTF == null) {
			nombreTF = new JTextField();
			nombreTF.setEnabled(false);
			
		}
		return nombreTF;
	}

	private JLabel getNombreLbl() {
		if (nombreLbl == null) {
			nombreLbl = new JLabel("Nombre");
		}
		return nombreLbl;
	}

	private JLabel getLetraLbl() {
		if (letraLbl == null) {
			letraLbl = new JLabel("Letra");
		}
		return letraLbl;
	}

	private JTextField getLetraTF() {
		if (letraTF == null) {
			letraTF = new JTextField();
			letraTF.setEnabled(false);
		}
		return letraTF;
	}
	
//********************** scroll pane ******************************

	public JScrollPane getScrollPane() {
		if(scrollPane == null) {
			scrollPane = new JScrollPane(getTemaTabla());
			scrollPane.setAutoscrolls(true);
		}
		return scrollPane;
	}
	
	public JTable getTemaTabla() {
		if (temaTabla == null) {
			temaTabla = new JTable(temaController.getModelo().getTablaModel());
			temaTabla.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
			temaTabla.setSelectionModel(temaController.getModelo().getTablaModel().getListSelectionModel());
		}
		return temaTabla;
	}

	@Override
	protected void actualizarCampos(ITema tema) {
		getNombreTF().setText(tema.getNombre());
		getLetraTF().setText(tema.getLetra());
	}

	@Override
	protected void actualizarTabla() {
		getTemaTabla().updateUI();
	}

	@Override
	protected Controller<ITema> getController() {
		return temaController;
	}

	@Override
	protected void habilitarTextField(boolean habilitar) {
		getNombreTF().setEnabled(habilitar);
		getLetraTF().setEnabled(habilitar);
	}

	@Override
	protected void iniciarCampos() {
		getNombreTF().setText("");
		getLetraTF().setText("");
	}

	@Override
	protected ITema actualizarDomain(ITema tema) {
		tema.setNombre(getNombreTF().getText());
		tema.setLetra(getLetraTF().getText());
		return tema;
	}
}
